package cn.iocoder.yudao.module.crossborder.util;

import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.module.crossborder.enums.CrossBorderCurrencyEnum;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Arrays;

/**
 * 跨境电商工具类
 *
 * @author LHL
 */
public class CrossBorderUtils {

    /**
     * 验证货币代码是否有效
     *
     * @param currencyCode 货币代码
     * @return 是否有效
     */
    public static boolean isValidCurrency(String currencyCode) {
        if (StrUtil.isBlank(currencyCode)) {
            return false;
        }
        return Arrays.stream(CrossBorderCurrencyEnum.values())
                .anyMatch(currency -> currency.getCode().equals(currencyCode.toUpperCase()));
    }

    /**
     * 根据货币代码获取小数位数
     *
     * @param currencyCode 货币代码
     * @return 小数位数
     */
    public static int getCurrencyDecimalPlaces(String currencyCode) {
        if (StrUtil.isBlank(currencyCode)) {
            return 2; // 默认2位小数
        }
        return Arrays.stream(CrossBorderCurrencyEnum.values())
                .filter(currency -> currency.getCode().equals(currencyCode.toUpperCase()))
                .findFirst()
                .map(CrossBorderCurrencyEnum::getDecimalPlaces)
                .orElse(2);
    }

    /**
     * 格式化金额，根据货币类型保留相应小数位数
     *
     * @param amount       金额
     * @param currencyCode 货币代码
     * @return 格式化后的金额
     */
    public static BigDecimal formatAmount(BigDecimal amount, String currencyCode) {
        if (amount == null) {
            return BigDecimal.ZERO;
        }
        int decimalPlaces = getCurrencyDecimalPlaces(currencyCode);
        return amount.setScale(decimalPlaces, RoundingMode.HALF_UP);
    }

    /**
     * 验证国家代码格式（ISO 3166-1 alpha-2）
     *
     * @param countryCode 国家代码
     * @return 是否有效
     */
    public static boolean isValidCountryCode(String countryCode) {
        if (StrUtil.isBlank(countryCode)) {
            return false;
        }
        // 简单验证：2位大写字母
        return countryCode.matches("^[A-Z]{2}$");
    }

    /**
     * 验证语言代码格式（ISO 639-1 或 BCP 47）
     *
     * @param languageCode 语言代码
     * @return 是否有效
     */
    public static boolean isValidLanguageCode(String languageCode) {
        if (StrUtil.isBlank(languageCode)) {
            return false;
        }
        // 支持 "en" 或 "zh-CN" 格式
        return languageCode.matches("^[a-z]{2}(-[A-Z]{2})?$");
    }

    /**
     * 生成跨境电商订单号
     *
     * @param platformCode 平台代码
     * @param countryCode  国家代码
     * @return 订单号
     */
    public static String generateOrderNo(String platformCode, String countryCode) {
        String timestamp = String.valueOf(System.currentTimeMillis());
        return String.format("CB%s%s%s", 
                StrUtil.upperFirst(platformCode), 
                countryCode.toUpperCase(), 
                timestamp.substring(timestamp.length() - 8));
    }

    /**
     * 生成跨境电商SKU
     *
     * @param categoryCode 分类代码
     * @param brandCode    品牌代码
     * @param sequence     序号
     * @return SKU
     */
    public static String generateSku(String categoryCode, String brandCode, Long sequence) {
        return String.format("CB%s%s%06d", 
                categoryCode.toUpperCase(), 
                brandCode.toUpperCase(), 
                sequence);
    }

}
